#include "Args.h"

#include <argparse/argparse.hpp>
#include <iostream>

#include "MyPrtFns.h"

const static std::string _cmd_te_ds{"te_ds"};  // test dose statistics
namespace
{
    // 辅助函数：获取程序名称（不包含路径）
    std::string getProgramName(const char* argv0)
    {
        std::string fullPath(argv0);
        size_t lastSlash = fullPath.find_last_of("/\\");
        if (lastSlash != std::string::npos)
        {
            return fullPath.substr(lastSlash + 1);
        }
        return fullPath;
    }
}  // namespace

bool Args::IsRunTe_DoseStat() const { return _argsParser->is_subcommand_used(_cmd_te_ds); }

// 私有构造函数
Args::Args() {}

// 获取单例实例
Args& Args::getInstance()
{
    static Args instance;
    return instance;
}

// 初始化命令行解析器
int Args::Parse(int argc, char** argv)
{
    if (argc < 1)
    {
        return -1;
    }

    _argsParser = std::make_unique<argparse::ArgumentParser>("run_test", "1.0", argparse::default_arguments::all, true);

    //======================== test dose command
    argparse::ArgumentParser te_ds_cmd(_cmd_te_ds);
    te_ds_cmd.add_description("Test dose statistics functions");
    te_ds_cmd.add_argument("-f", "--file")
        .default_value(std::string{"d250905_voxel_volume.npz"})
        .help("file of data: volume, dose, int format of numpy .npz.");
    te_ds_cmd.add_argument("-v", "--v_name").default_value(std::string{"volumes"}).help("inner name of voxel volumes ndarray");
    te_ds_cmd.add_argument("-d", "--d_name").default_value(std::string{"doses"}).help("inner name of voxel doses ndarray");
    //------------
    _argsParser->add_subparser(te_ds_cmd);

    try
    {
        _argsParser->parse_known_args(argc, argv);
        const auto& te_ds = _argsParser->at<argparse::ArgumentParser>(_cmd_te_ds);
        _te_dose_stat = Te_DoseStat{
            te_ds.get<std::string>("--file"),
            te_ds.get<std::string>("-v"),
            te_ds.get<std::string>("-d"),
        };
    }
    catch (const std::exception& err)
    {
        MYERROR(err.what());
        std::cerr << *_argsParser;
        return 1;
    }

    return 0;
}

void Args::PrintHelp() const { std::cerr << *_argsParser; }
